타입스크립트의 데이터 타입
타입스크립트의는 자바스크립트의 기본 자료형을 포함하고, 타입스크립트에서 별도의 자료형이 추가 되었다.
다음은, ESMAScript 표준에 따른 기본 자료형(primitive tpyes)은 6가지를 설명하고 있다.
1. primitive type: ECMAScript 표준에 따른 기본 자료형
Wrapper Object 방식(ex.
new Boolean(true))으로 Primitive Type을 사용할 수 있지만 사용하지 말자!
boolean
number: 부동 소수점
string
- 문자열 데이터를 둘러싸기 위해 큰 따옴표 (
") 나, 작은 따옴표 (') 를 사용 - Template String (ES6 이후)
- backtick(=backquote)
`Hello, my name is ${fullName}`
null
typeof(null) # object
undefined
typeof(undefined) # undefined
symbol (ECMAScript 2015 에 추가)
Symbol을 사용하기 위해서는 아래와 같이 tsconfig.json 설정이 필요하다.
...
"compilerOptions": {
...
"lib": ["ES2015", "DOM"]
...
}
...
- Symbol을 함수로 사용해서 symbol 타입을 만들 수 있음
- Primitive Type 값을 담아서 사용
- 고유하고 수정 불가능한 값으로 만듦
- 주로 접근을 제어 하는데 쓰임
console.log(Symbol('foo') === Symbol('foo')); // false
let sym = Symbol();
let obj = {
[sym]: "value"
};
console.log(obj[sym]); // "value"
2. object
primitive type이 아닌 것을 나타내고 싶을 때 사용하는 타입
let obj: object = {};
obj = {name: 'Mark'};
obj = [{name: 'Mark'}];
obj = 39; // Error
obj = 'Mark'; // Error
obj = true; // Error
obj = 100n; // Error
obj = Symbol(); // Error
obj = null; // Error
obj = undefined; // Error
// array
let list1: number[] = [1, 2, 3];
let list2: (number | string)[] = [1, 2, 3, "4"]
3. 타입스크립트에서 추가된 타입
tuple
// tuple
let x: [string, number];
x = ["hello", 39];
const person: [string, number] = ["Mark", 39]
const [first, second] = person;
any
리턴 타입이 any인 변수는 어떤 것이든 할 수 있다.
any는 최대한 안쓰는게 좋음, unknown을 쓰되 타입을 한정시키는 것을 추천
function returnAny(message: any): any {
console.log(message)
}
const any1 = returnAny("리턴은 아무거나")
any1.toString() // 가능...
let looselyTyped: any = {};
let d = looselyTyped.a.b.c.d; // any는 객체를 통해 전파됨
// ^ = let d: any
unknown
타입을 한정 시켜야만 쓸 수 있다.
typeof 검사, 비교 검사 또는 고급 타입 가드를 수행하여 보다 구체적인 변수로 좁힐 수 있다.
declare const maybe: unknown;
// 'maybe' could be a string, object, boolean, undefined, or other types
const aNumber: number = maybe; // Type 'unknown' is not assignable to type 'number'.
if (maybe === true) {
// TypeScript knows that maybe is a boolean now
const aBoolean: boolean = maybe;
// So, it cannot be a string
const aString: string = maybe; // Type 'boolean' is not assignable to type 'string'.
}
if (typeof maybe === "string") {
// TypeScript knows that maybe is a string
const aString: string = maybe;
// So, it cannot be a boolean
const aBoolean: boolean = maybe; // Type 'string' is not assignable to type 'boolean'.
}
never
리턴에 사용됨, 몇 가지로 한정되어 있음
// Function returning never must have unreachable end point
function error(message: string): never { // 어떠한 형태도 리턴되지 않는다 -> never
throw new Error(message);
}
// Inferred return type is never
function fail() {
return error("Something failed");
}
// Function returning never must have unreachable end point
function infiniteLoop(): never {
while (true) {
}
}
never는 모든 타입의 subtype, 따라서 any 조차도 never에 할당 할 수 없다.
let a: string = 'hello';
if (typeof a !== 'string') {
let b: never = a;
}
void
값은 없고 타입만 있다. 일반적으로 값을 반환하지 않는(undefined) 함수의 리턴 타입으로 사용한다.
function returnVoid(message): void {
console.log(message);
return undefined; // undefined만 void에 할당할 수 있다.
}
returnVoid('리턴이 없다');
let unusable: void = undefined;